﻿#include <learn/topo/topo_builder.h>
#include <learn/topo/topo_shell.h>

using namespace xi;
using namespace xi::topo;

Topo_Shell::Topo_Shell() : Topo_Shape(), m_shapes(std::monostate{})
{
}

Topo_Shell::~Topo_Shell()
{
    Topo_Builder builder;
    auto w = wire();
    if (w)
        builder.remove_wire(w);

    auto f = face();
    if (f)
        builder.remove_face(f);

    auto s = std::get_if<std::vector<Topo_Shell *>>(&m_shapes);
    if (s != nullptr)
    {
        for (auto sub : *s)
            builder.remove_shell(sub);
    }
}

std::vector<Topo_Shell *> Topo_Shell::subshells() const
{
    // 注意返回的是 Topo_Shell **，要解引用
    auto s = std::get_if<std::vector<Topo_Shell *>>(&m_shapes);
    if (s == nullptr)
        return {};
    else
        return *s;
}

Topo_Wire *Topo_Shell::wire() const
{
    // 注意返回的是 Topo_Wire **，要解引用
    auto w = std::get_if<Topo_Wire *>(&m_shapes);
    if (w == nullptr)
        return nullptr;
    else
        return *w;
}

Topo_Face *Topo_Shell::face() const
{
    // 注意返回的是 Topo_Face **，要解引用
    auto f = std::get_if<Topo_Face *>(&m_shapes);
    if (f == nullptr)
        return nullptr;
    else
        return *f;
}